package 多线程.Threadpool;


import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * ScheduledThreadPoolExecutor会把待调度的任务（ScheduledFutureTask：下面都简化为task）放到一个DelayQueue中。
 *
 * task主要包含3个变量：
 *
 * long time：表示这个任务将要被执行的具体时间。
 *
 * long sequenceNumber：表示这个任务被添加到ScheduledThreadPoolExecutor中的序号。
 *
 * long period：表示任务执行的间隔周期。
 *
 * DelayQueue封装了一个PriorityQueue，这个PriorityQueue会对队列中的task进行排序。排序时，time小的排在前面（时间早的任务先执行），
 * 如果两个time相同，就比较sequenceNumber，小的排在前面。
 */
public class ScheduleDemo {
    public static void main(String[] args) {
        //创建ScheduledExecutorService线程池
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);
        //延迟5秒执行任务
        executor.schedule(() -> {
            //要执行的任务
            System.out.println("任务1正在执行");
        }, 5, TimeUnit.SECONDS);

        //定时执行任务（延迟5秒开始，每隔10秒执行一次）
        executor.scheduleAtFixedRate(() -> {
            //要执行的任务
            System.out.println("任务2正在执行");
        }, 5, 10, TimeUnit.SECONDS);

        // 定时执行任务（延迟 5 秒开始，每隔10秒执行一次，上一次任务执行完成后再延迟 10 秒）
        executor.scheduleWithFixedDelay(() -> {
            // 要执行的任务
            System.out.println("任务3正在执行");
        }, 5, 10, TimeUnit.SECONDS);
    }
}